package com.falcon.domain.po;

import com.swan.mybatis.anno.Id;
import com.swan.mybatis.anno.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.FieldNameConstants;

/** 表字段信息
 * @author zongf
 * @since 2019-11-30
 */
@Table(name = "information_schema.columns")
@Setter @Getter
@FieldNameConstants
public class MysqlColumnPO {

    // 数据库名
    @Id
    private String tableSchema;

    // 表名
    private String tableName;

    // 字段名
    private String columnName;

    // 字段类型, 如 varchar, tinyint, datetime
    private String dataType;

    // 类型字符串,包含长度限制,格式为: varchar(255), tinyint(1),datetime...
    private String columnType;

    // 默认值
    private String columnDefault;

    // 列注释
    private String columnComment;

    // 字段顺序
    private int ordinalPosition;

    // 字符串类型: 字符最大个数,不区分中英文
    private long characterMaximumLength;

    // 数字类型: 整数部分最大位数
    private int numericPrecision;

    // 数字类型: 小数最大位数
    private int numericScale;

    // 是否可为空
    private String isNullable;

    // 是否是主键列, 不代表是唯一主键, 可能是联合主键
    private String columnKey;

    // 自增列时:  auto_increment
    // 时间字段，设置默认值时，为: DEFAULT_GENERATED
    // 时间字段，设置只在更新时设置默认值时，为: DEFAULT_GENERATED on update CURRENT_TIMESTAMP
    private String extra;

    public boolean isAutoIncrement() {
        return "auto_increment".equals(extra);
    }

    public boolean isPK() {
        return "PRI".equals(columnKey);
    }

    public boolean isNullAble() {
        return "YES".equals(isNullable);
    }

    public Boolean isAutoTimeOnCreate() {
        return extra.contains("DEFAULT_GENERATED");
    }

    public Boolean isAutoTimeOnUpdate() {
        return extra.contains("DEFAULT_GENERATED on update");
    }

    public Boolean isUnsigned() {
        return this.getColumnType().contains("unsigned");
    }
}
